//src/disk_builder.c
#include "disk_builder.h"
#include "utils.h"
#include <stdlib.h>
#include <unistd.h>

static const char* MOUNT_POINT = "/mnt/ocim_builder_tmp";

int create_and_populate_disk(const char* disk_path, long disk_size_mb, const char* rootfs_path) {
    LOG_INFO("阶段 1: 创建并填充虚拟磁盘...");

    // 1. 创建虚拟磁盘文件
    LOG_INFO("创建大小为 %ldMB 的虚拟磁盘文件: %s", disk_size_mb, disk_path);
    if (run_command("truncate -s %ldM %s", disk_size_mb, disk_path) != 0) {
        LOG_ERROR("创建虚拟磁盘文件失败");
        return -1;
    }

    // 2. ***** 关键修改：创建向后兼容的 Ext4 文件系统 *****
    //    - 保持块大小为 4096
    //    - 禁用所有可能与旧版 libext2fs 冲突的高级特性
    LOG_INFO("将磁盘格式化为最大兼容性的 Ext4 (块大小 4096)");
    if (run_command("mkfs.ext4 -F -q -b 4096 -O ^64bit,^metadata_csum,^flex_bg,^extent %s", disk_path) != 0) {
        LOG_ERROR("格式化磁盘失败");
        return -1;
    }
    
    // 3. 挂载 (需要root权限)
    LOG_INFO("挂载虚拟磁盘到 %s (需要 sudo 权限)", MOUNT_POINT);
    if (getuid() != 0) {
        LOG_INFO("当前非 root 用户, 将使用 sudo 执行挂载和复制操作");
    }
    
    if (run_command("sudo mkdir -p %s", MOUNT_POINT) != 0 ||
        run_command("sudo mount -o loop %s %s", disk_path, MOUNT_POINT) != 0) {
        LOG_ERROR("挂载 loop 设备失败");
        return -1;
    }

    // 4. 填充文件
    LOG_INFO("从 %s 复制文件到挂载点", rootfs_path);
    if (run_command("sudo cp -a %s/. %s/", rootfs_path, MOUNT_POINT) != 0) {
        LOG_ERROR("复制 rootfs 文件失败");
        run_command("sudo umount %s", MOUNT_POINT); // 尝试清理
        return -1;
    }

    // 5. 强制同步
    LOG_INFO("强制同步文件系统缓存...");
    if (run_command("sudo sync") != 0) {
        LOG_ERROR("sync 命令执行失败");
    }

    // 6. 卸载
    LOG_INFO("卸载虚拟磁盘");
    if (run_command("sudo umount %s", MOUNT_POINT) != 0) {
        LOG_ERROR("卸载失败, 但将继续尝试扫描磁盘文件。请手动检查并清理 %s", MOUNT_POINT);
    }

    LOG_INFO("阶段 1 完成: 虚拟磁盘创建并填充完毕。");
    return 0;
}